home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1997 June
/
MACPOWER-1997-06.ISO.7z
/
MACPOWER-1997-06.ISO
/
AMUG
/
PROGRAMMING
/
BSDSoundLib 1.0.1.sit
/
BSDSoundLib dist
/
BSDSoundLib ƒ
/
BSDSoundLib.cp
< prev
next >
Wrap
Text File
|
1997-01-21
|
5KB
|
221 lines
/*
File: BSDSoundLib.c
Contains: Sound Routines.
Version: Technology: Torture Chamber v1.0
Package: BSDSoundLib v1.0.1
Copyright: ゥ 1997, BuggySoftェ Development.
By Scott Dunbar
*/
#ifndef __BSDSOUNDLIB_
#include "BSDSoundLib.h"
#endif
#define volume(lvol, rvol) (rvol << 16L | lvol)
short numChannels = 0, curSndLoc;
Boolean sndChanActive[kMaxSndChans], loopingActive;
SndChannelPtr sndChan[kMaxSndChans], loopingSndChan;
SndCallBackUPP soundCallBackUPP, loopingCallBackUPP;
static SoundHeaderPtr GetSoundHeader (Handle sndHandle);
static pascal void SoundCallBack (SndChannelPtr chan, SndCommand cmd);
SndChannelPtr InitChannel (long chanMode, SndCallBackUPP callBackProc);
void DisposeChannel (SndChannelPtr chan);
void DisposeLoopingChannel (void);
static pascal void loopingCallBack (SndChannelPtr chan, SndCommand cmd);
void SetChanVol (short chanNum, short balance) {
SndCommand sc;
if (sndChan[chanNum] != nil) {
if (balance < -128) balance = -128;
if (balance > 128) balance = 128;
sc.cmd = volumeCmd;
sc.param1 = 0;
sc.param2 = volume(128 - balance, 128 + balance);
SndDoImmediate(sndChan[chanNum], &sc);
}
}
void BalanceSndChannels (void) {
short x;
for (x = 0; x < numChannels; x++)
if (sndChanActive[x] == false) SetChanVol(x, kBalanced);
}
short FindFreeChannel (void) {
short x;
for (x = 0; x < numChannels; x++)
if (sndChanActive[x] == false) return(x);
return(-1);
}
void InitSoundUtils (void) {
short x, y = 0;
soundCallBackUPP = NewSndCallBackProc(SoundCallBack);
for (x = 0; x < kMaxSndChans; x++) {
sndChan[y] = InitChannel(initStereo, soundCallBackUPP);
if (sndChan[y] != nil) {
sndChanActive[y] = false;
numChannels++;
y++;
} else y--;
}
}
void DisposeSoundUtils (void) {
short x;
for (x = 0; x < numChannels; x++) DisposeChannel(sndChan[x]);
DisposeRoutineDescriptor(soundCallBackUPP);
}
static SoundHeaderPtr GetSoundHeader (Handle sndHandle) {
long offset;
if (GetSoundHeaderOffset((SndListHandle)sndHandle, &offset) != noErr) return nil;
else return ((SoundHeaderPtr)((Ptr)(*sndHandle) + offset));
}
static pascal void SoundCallBack (SndChannelPtr chan, SndCommand cmd) {
sndChanActive[chan->userInfo] = false;
}
SndChannelPtr InitChannel (long chanMode, SndCallBackUPP callBackProc) {
SndChannelPtr chan = nil;
if (chanMode != (initChanLeft||initChanRight||initNoInterp||initNoDrop||initMono||initStereo))
chanMode = initStereo + initNoInterp;
if ((SndNewChannel(&chan, sampledSynth, chanMode, callBackProc) != noErr) || (MemError() != noErr) || (chan == nil))
DisposePtr((Ptr)chan);
return(chan);
}
void DisposeChannel (SndChannelPtr chan) {
SndCommand sc;
if (chan != nil) {
sc.cmd = flushCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoImmediate(chan, &sc);
sc.cmd = quietCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoImmediate(chan, &sc);
SndDisposeChannel(chan, false);
DisposePtr((Ptr)chan);
}
}
void SilenceChannel (short chanNum) {
SndCommand sc;
if (sndChan[chanNum] != nil) {
sc.cmd = flushCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoImmediate(sndChan[chanNum], &sc);
sc.cmd = quietCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoImmediate(sndChan[chanNum], &sc);
sndChanActive[chanNum] = false;
}
}
void PlaySnd (Handle snd) {
PlaySound(FindFreeChannel(), snd);
}
void PlaySound (short chanNum, Handle snd) {
SndCommand sc;
if ((sndChan[chanNum] != nil) && (snd != nil)) {
sc.cmd = bufferCmd;
sc.param1 = 0;
sc.param2 = (long)GetSoundHeader(snd);
SndDoImmediate(sndChan[chanNum], &sc);
sndChanActive[chanNum] = true;
sndChan[chanNum]->userInfo = chanNum;
sc.cmd = callBackCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoCommand(sndChan[chanNum], &sc, true);
}
}
void InitLoopingSounds (void) {
loopingCallBackUPP = NewSndCallBackProc(loopingCallBack);
loopingSndChan = InitChannel(initStereo, loopingCallBackUPP);
}
void DisposeLoopingSounds (void) {
DisposeLoopingChannel();
DisposeRoutineDescriptor(loopingCallBackUPP);
}
void PlayLoopingSound (Handle snd) {
SndCommand sc;
if ((loopingSndChan != nil) && (snd != nil)) {
loopingSndChan->userInfo = (long)GetSoundHeader(snd);
sc.cmd = callBackCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoCommand(loopingSndChan, &sc, false);
}
}
void SilenceLoopingChannel (void) {
SndCommand sc;
if (loopingSndChan != nil) {
sc.cmd = flushCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoImmediate(loopingSndChan, &sc);
sc.cmd = quietCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoImmediate(loopingSndChan, &sc);
loopingActive = false;
}
}
void DisposeLoopingChannel (void) {
if (loopingSndChan != nil) {
SilenceLoopingChannel();
SndDisposeChannel(loopingSndChan, false);
DisposePtr((Ptr)loopingSndChan);
}
}
static pascal void loopingCallBack (SndChannelPtr chan, SndCommand cmd) {
SndCommand sc;
sc.cmd = bufferCmd;
sc.param1 = 0;
sc.param2 = chan->userInfo;
SndDoImmediate(chan, &sc);
sc.cmd = callBackCmd;
sc.param1 = 0;
sc.param2 = 0;
SndDoCommand(chan, &sc, true);
}